#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
开发一个坐标计算工具，
A表示向左移动，D表示向右移动，W表示向上移动，S表示向下移动
从（0,0）点开始移动，从输入字符串里面读取一些坐标，并将最终输入结果输出到输出文件里面。
输入：
合法坐标为A(或者D或者W或者S) + 数字（两位以内）
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。
下面是一个简单的例子 如：
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程：
起点（0,0）
+   A10   =  (-10,0)
+   S20   =  (-10,-20)
+   W10  =  (-10,-10)
+   D30  =  (20,-10)
+   x    =  无效
+   A1A   =  无效
+   B10A11   =  无效
+  一个空 不影响
+   A10  =  (10,-10)
结果 （10， -10）
注意请处理多组输入输出
"""


class Coordinate:
    # 'Ins': (axis, base)
    RULE = {'D': ('x', 1), 'A': ('x', -1),
            'W': ('y', 1), 'S': ('y', -1)}

    def __init__(self, x: int = 0, y: int = 0):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, val):
        self._x = val

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, val):
        self._y = val

    def __repr__(self):
        fmt = '({}, {})'
        return fmt.format(self.x, self.y)

    __str__ = __repr__

    def move(self, instructions: str, sep: str = ';'):
        # remove empty space and upper it
        instructions = instructions.strip().upper()
        # translate instruction to list
        if sep in instructions:
            instructions = instructions.split(sep)
        else:
            instructions = list((instructions,))

        for ins in instructions:
            if ins:
                self._moving(ins)

    def _moving(self, ins: str):
        try:
            rule, value = ins[0], ins[1:]
            axis, base = self.RULE.get(rule, ('x', 0))
            value = int(value) if value.isdigit() else 0
        except IndexError:
            pass
        else:
            xy = getattr(self, axis) + base * value
            setattr(self, axis, xy)


if __name__ == '__main__':
    c = Coordinate()
    c.move('A37;S1;S72;S41;W21;W32;A45;A98;D97;D69;W57;W11;S41;S0;S24;S83;A75;W77;S32;D18;A24;D20;A65;D95;S18;W56;A84;W30;S3;S50;D64;S84;D82;A86;A36;S85;S94;W64;W62;A12;W12;S84;W29;A52;A73;W55;W71;D43;D76;D49;W19;S56;W63;W56;A68;D68;D40;A48;W5;A12;S84;A2;S44;A93;D51;D64;S4;W32;W27;W15;W70;A47;S77;S88;A25;D51;D8;A34;A71;A5;D83;S36;S72;A34;D46;S29;S5;W57;W16;S42;A23;A30;D43;S0;W62;A34;D60;D31;W89;W91;S87;A15;S15;S18;W83;S82;W87;W73;D42;A92;D48;A65;D36;A11;W50;W38;W2;A0;D65;W29;D56;S64;D31;W8;A56;A45;A56;W54;A97;D97;A90;S72;A95;A89;S78;A35;A31;W68;W42;A73;S73;A24;S28;D69;W53;S54;D80;D27;W24;S86;A17;A36;A41;A1;D19;S53;S96;A31;A52;A63;A18;S54;A35;A82;W95;D8;W48;S75;W11;S9;W60;D68;A92;A96;W32;S30;D26;W61;S0;D10;S89;W31;D4;W37;S49;D79;S56;A87;S61;A61;D96;W86;S81;D50;S91;A68;A82;A36;A16;S6;W25;D76;D94;A20;A37;D91;S58;A54;S77;S27;A35;S6;A88;A14;S72;D12;A95;W93;W1;A73;A55;A13;S55;W43;W6;D37;W19;W79;W56;S26;A36;W85;A6;W94;A54;A12;S0;A13;D18;W14;A52;W44;D83;W17;W73;A72;D56;A63;S14;A64;A84;S54;D67;A92;D46;A51;D99;W42;W2;')
    print(c)
    assert str(c) == '(10, -10)'
    # 抱歉，刚看错了~，写的没有啥问题~

